home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / DJLSR111.ZIP / lib / crt0.s next >
Text File  |  1993-11-30  |  4KB  |  231 lines

  1.  
  2. /*
  3. **    Called as start(argc, argv, envp)
  4. */
  5.  
  6. /*    gs:edx points to prog_info structure.  All other registers are OBSOLETE
  7. **    but included for backwards compatibility
  8. */
  9.  
  10. /* These symbols are for global constructors and destructors */
  11.     .section    .ctor
  12.     .globl        ___go32_first_ctor
  13. ___go32_first_ctor:
  14.     .section    .dtor
  15.     .globl        ___go32_last_ctor
  16. ___go32_last_ctor:
  17.     .globl        ___go32_first_dtor
  18. ___go32_first_dtor:
  19.     .data
  20.     .globl        ___go32_last_dtor
  21. ___go32_last_dtor:
  22.  
  23.     .text
  24.     .globl    _start
  25. _start:
  26.     .globl    start
  27. start:
  28. #ifdef EMU387
  29.     pusha
  30.     push    %gs
  31. #endif
  32.     movl    %eax,__hard_master
  33.     movl    %esi,___pid
  34.     movl    %edi,___transfer_buffer
  35.     movl    %ebx,_ScreenPrimary
  36.     movl    %ebp,_ScreenSecondary
  37.  
  38.     cmpl    $0, %edx
  39.     je    Lcopy_none
  40.     movw    %gs,%cx
  41.     movw    %ds,%ax
  42.     cmpw    %cx,%ax
  43.     je    Lcopy_none
  44.  
  45.     movl    %gs:(%edx), %ecx
  46.     cmpl    __go32_info_block, %ecx
  47.     jbe    Lcopy_less
  48.     movl    __go32_info_block, %ecx
  49. Lcopy_less:
  50.     movl    $__go32_info_block, %edi
  51.     addl    $3, %ecx
  52.     andl    $0xfffffffc, %ecx
  53.     movl    %ecx, (%edi)
  54.     addl    $4, %edi
  55.     addl    $4, %edx
  56.     subl    $4, %ecx
  57. Lcopy_more:
  58.     movl    %gs:(%edx), %eax
  59.     movl    %eax, (%edi)
  60.     addl    $4, %edx
  61.     addl    $4, %edi
  62.     subl    $4, %ecx
  63.     jnz    Lcopy_more
  64.  
  65.     movl    __go32_info_block+4, %eax
  66.     movl    %eax, _ScreenPrimary
  67.     movl    __go32_info_block+8, %eax
  68.     movl    %eax, _ScreenSecondary
  69. /* Backward compatibility - do not copy this one!
  70. **    movl    __go32_info_block+12, %eax
  71. **    movl    %eax, ___transfer_buffer
  72. */
  73.     movl    __go32_info_block+20, %eax
  74.     movl    %eax, ___pid
  75.     movl    __go32_info_block+24, %eax
  76.     movl    %eax, __hard_master
  77.  
  78.     jmp    Lcopy_done
  79.  
  80. Lcopy_none:
  81.     movl    %ebx,__go32_info_block+4
  82.     movl    %ebp,__go32_info_block+8
  83.     movl    %edi,__go32_info_block+12
  84.     movl    $4096,__go32_info_block+16
  85.     movl    %esi,__go32_info_block+20
  86.     movl    %eax,__go32_info_block+24
  87.     movl    $28, __go32_info_block
  88. Lcopy_done:
  89.  
  90. #ifndef EMU387
  91.     call    __setstack
  92. #endif
  93.     xorl    %esi,%esi
  94.     xorl    %edi,%edi
  95.     xorl    %ebp,%ebp
  96.     xorl    %ebx,%ebx
  97.  
  98.     movl    %esp,%ebx
  99. #ifdef MAKE_GCRT0
  100.     call    mcount_init /* initialize the profiler */
  101. #endif
  102.     movl    8(%ebx),%eax
  103.     pushl    %eax
  104.     movl    %eax,_environ
  105.     pushl    4(%ebx)
  106.     pushl    (%ebx)
  107.     call    ___main
  108.     call    _main
  109.     addl    $12,%esp
  110. #ifdef EMU387
  111.     pop    %gs
  112.     popa
  113. #else
  114.     pushl    %eax
  115.     call    _exit
  116.  
  117. exit_again:
  118.     movl    $0x4c00,%eax
  119.     int    $0x21
  120.     jmp    exit_again
  121. #endif
  122.  
  123.     ret
  124.  
  125.  
  126. #ifdef MAKE_GCRT0
  127.     .globl    __exit
  128. __exit:
  129.     call    mcount_write /* make sure we dump the output */
  130. exit_again2:
  131.     movb    4(%esp),%al
  132.     movb    $0x4c,%ah
  133.     int    $0x21
  134.     jmp    exit_again2
  135.  
  136. /* Here is where we initialize the timer interrupt - specific to go32 */
  137. /* In this case, the timer calls mcount_isr */
  138.     .globl    mcount_isr_init
  139. mcount_isr_init:
  140.     movw    __go32_info_block+36, %ax    /* run mode */
  141.     cmp    $1,%ax
  142.     jb    skip_mcount
  143.     cmp    $3,%ax
  144.     ja    skip_mcount
  145.     
  146.     movw    $16,%ax
  147.     movw    %ax,%gs
  148.  
  149.     movzbl    __hard_master,%eax    /* timer is on irq 0 */
  150.     shll    $3,%eax /* times 8 bpv */
  151. /*    movl    $960,%eax       vector 0x78 * 8 bpv */
  152.     movw    %gs:(%eax),%cx
  153.     movw    %cx,mc_chain
  154.     movw    %gs:6(%eax),%cx
  155.     movw    %cx,mc_chain_hi
  156.     movw    %gs:2(%eax),%cx
  157.     movw    %cx,mc_chain_sel
  158.  
  159.     movl    $mcount_isr,%ecx
  160.     movw    %cx,%gs:(%eax)
  161.     movw    $0xd8,%gs:2(%eax)    /* selector 27 == 32-bit code */
  162.     movw    $0x8f00,%gs:4(%eax)
  163.     rorl    $16,%ecx
  164.     movw    %cx,%gs:6(%eax)
  165.     movw    %ds,%ax
  166.     movw    %ax,%gs
  167. skip_mcount:
  168.     movl    mcount_histogram,%eax
  169.     movl    $1,(%eax)
  170.     ret
  171.  
  172. /* Obtain the PC where we interrupted, and bump the histogram.  We should  */
  173. /* do error checking here, but we don't.  This routine is specific to go32 */
  174. /* in some spots */
  175. mcount_isr:
  176.     pushl    %eax
  177.     cmpl    $1,mcount_skip
  178.     je    L0
  179.     movl    4(%esp),%eax /* get the PC */
  180.     subl    $0x1020,%eax /* to fit in low..high */
  181.     andl    $0xfffffffc,%eax
  182.     shrl    $1,%eax /* now points to one 4-byte entry */
  183.     addl    mcount_histogram,%eax
  184.     incw    (%eax)
  185. L0:
  186.     popl    %eax
  187.     ljmp    mc_chain /* chain to the next timer vector */
  188.     iret
  189. #endif
  190.  
  191.     .data
  192.  
  193.     .globl    _environ
  194. _environ:
  195.     .long    0
  196.  
  197.     .globl    ___pid
  198. ___pid:
  199.     .long    42
  200.  
  201.     .globl    ___transfer_buffer
  202. ___transfer_buffer:
  203.     .long    0
  204.  
  205.     .globl    _ScreenPrimary
  206. _ScreenPrimary:
  207.     .long    0
  208.  
  209.     .globl    _ScreenSecondary
  210. _ScreenSecondary:
  211.     .long    0
  212.  
  213.     .globl    __hard_master
  214.     .globl    __hard_slave
  215.     .globl    __core_select
  216. __hard_master:
  217.     .byte    0
  218. __hard_slave:
  219.     .byte    0
  220. __core_select:
  221.     .short    0
  222.  
  223. #ifdef MAKE_GCRT0
  224. mc_chain:
  225.     .short    0
  226. mc_chain_hi:
  227.     .short    0
  228. mc_chain_sel:
  229.     .short    0
  230. #endif
  231.